package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import java.awt.event.KeyListener;
import java.awt.event.FocusListener;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import vista.Mensaje;
import vista.VentanaCategoria;
import modelo.CategoriaDao;
import modelo.Categoria;

public class ControladorCategoria extends WindowAdapter implements ActionListener,KeyListener,FocusListener
{

	private enum MoverRegistro {PRIMERO,ATRAS,SIGUIENTE,ULTIMO};
	
	
	private VentanaCategoria ventana;
	private ControladorPrincipal controladorPrincipal;
	private ArrayList<Categoria> categorias;
    private CategoriaDao categoriaDao;
    private int i;
    private boolean guardando;
    
	public ControladorCategoria(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		ventana= new VentanaCategoria();
		
		categoriaDao= new CategoriaDao();
		
		categorias= new ArrayList<Categoria>();
		i= 0;
		guardando=false;
	
		ventana.addListener((ActionListener) this);
		ventana.addListener((KeyListener)this);
		ventana.addListener((WindowListener)this);
		ventana.addListener((FocusListener)this);
		
		ventana.setVisible(true);
	}
	
	
	private void moverRegistro(MoverRegistro enumMR)
	{
	
		if (categorias.size()>0)
		{ 	 
			switch(enumMR)
			{
			  case PRIMERO:
			  {
		        i = 0;
			    break;
			  }
			  case ATRAS:
			  {
				 i -= 1;  
			     if (i<0)
			    	 i= categorias.size()-1;
			     
			     break;
			  }
			  case SIGUIENTE:
			  {
				  i= (i + 1) % categorias.size();
				   break; 
			  }
			  case ULTIMO:
			  {
				  i= categorias.size() - 1;
				  break;  
			  }
			}
			actualizarVentana(categorias.get(i));
		}		
	}
	
	private void guardar()
	{
		
		Categoria categoria= new Categoria(ventana.getCodCategoria(),ventana.getNombreCorto(),ventana.getNombreLargo());
		
		try
		{
			
	      if (categoria.validar())
	      {	  
	    	  if (!categoriaDao.consultarCategoria(categoria))
		     {
		    	 if (categoriaDao.isEliminado(categoria))
		    	 {
		    		 if (Mensaje.mostrarConfirmacion("La categoria Habia sido Eliminada Previamente\nDesea Reactivarla?"))
		    		 {		 
		    		   if (categoriaDao.activarCategoria(categoria))
		    			  Mensaje.mostrarInformacion("La Categoria se ha Activado con Exito");
		    		   else
		    			  Mensaje.mostrarError("Error al Activar Categoria");
		    		 }  
		    	 } 
		    	 else
		    	 {
		    		 if (Mensaje.mostrarConfirmacion("Desea Registrar esta Categoria?"))
		    		 {		 
		    		   if (categoriaDao.registrarCategoria(categoria))
		    			  Mensaje.mostrarInformacion("La Categoria se ha registrado con Exito");
		    		   else
		    			 Mensaje.mostrarError("Error al Registrar Categoria");
		    		 } 
		    	 }
		    	 	 
		     }
		     else
		     {
		    	 Mensaje.mostrarError("El Categoria ya fue Registrado!!!");
		     } 	 
		    
	      }
	      else
	      {	  
	         Mensaje.mostrarError("La Informacion de la Categoria es invalida!!!");
	         
	      }
	      
	      actualizarLista();
	      iniciarBotones();
		  
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
		}
		
	}
	
	private void modificar()
	{
		Categoria categoria= new Categoria(ventana.getCodCategoria(),ventana.getNombreCorto(),ventana.getNombreLargo());
	  
		try
		{
			
	      if (categoria.validar())
	      {	  
	    	  if (categoriaDao.consultarCategoria(categoria))
		     {
		    	 
		    	 if (Mensaje.mostrarConfirmacion("Desea Modificar la Informacion de esta Categoria?"))
		    	 {
		    		
		    		if (categoriaDao.actualizarCategoria(categoria))
		    			Mensaje.mostrarInformacion("La Categoria se ha Modificado con Exito");
		    		else
		    		   Mensaje.mostrarError("Error al Modificar Categoria");
		    		 
		    	 }	 
		     }
		     else
		     {
		    	 Mensaje.mostrarError("La Categoria no ha sido Registrado!!!");
		     } 	 
		    
	      }
	      else
	      {	  
	         Mensaje.mostrarError("La Informacion de la Categoria es invalida!!!");
	         
	      }
	      
	      actualizarLista();
	      iniciarBotones();
		  
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
		}
	}
	
	private void eliminar()
	{
		Categoria categoria= new Categoria(ventana.getCodCategoria(),ventana.getNombreCorto(),ventana.getNombreLargo());
	  
		try
		{
			
	     
			if (categoriaDao.consultarCategoria(categoria))
		    {
		    	if (!categoriaDao.isDependiente(categoria))
		    	{		
		    	  if (Mensaje.mostrarConfirmacion("Desea Eliminar a esta Categoria?"))
		    	  {
		    		
		    		 if (categoriaDao.eliminarCategoria(categoria))
		    		 	Mensaje.mostrarInformacion("El Categoria se ha Eliminado con Exito");
		    		 else
		    		    Mensaje.mostrarError("Error al Eliminar Categoria");
		    		 
		    	   }
		    	}
		    	else
		    		Mensaje.mostrarError("La Categoria No Puede ser Eliminada\nExiste Informacion Relacionada con esta!!!");
		    }
		    else
		    {
		    	 Mensaje.mostrarError("La Categoria ya se ha Eliminado!!!");
		    } 	 
		    
	    
	      
	      actualizarLista();
	      iniciarBotones();
		  
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
		}
	}
	
	private void actualizarVentana(Categoria categoria)
	{
		if (categoria!=null)
		{
		   ventana.actualizarInfo(categoria.getCodCategoria(),categoria.getNombreCorto(),categoria.getNombreLargo());
		}		
	}
	
	private void actualizarLista()
	{
		try
		{
		  if (!categorias.isEmpty())	
			categorias.clear();
		  
		  categorias.addAll(categoriaDao.consultarCategoriaActivos());
		  moverRegistro(MoverRegistro.PRIMERO);
		  
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
			controladorPrincipal.visualizarVentana();
			ventana.setVisible(false);
			ventana.dispose();
		}
	}
	
	
	private void iniciarBotones()
	{
		if (!categorias.isEmpty())
		{
			ventana.deshabilitarBotonActualizar("Guardar");
			ventana.habilitarBotonActualizar("Eliminar");
			ventana.deshabilitarBotonActualizar("Cancelar");
			ventana.habilitarNavegacion();
		}
		else
		{
			ventana.habilitarBotonActualizar("Guardar");
			ventana.deshabilitarBotonActualizar("Eliminar");
			ventana.habilitarBotonActualizar("Cancelar");
			ventana.deshabilitarNavegacion();
		}		
		
		ventana.deshabilitarBotonActualizar("Modificar");
		
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if (e.getSource() instanceof javax.swing.JButton)
		{
			if (e.getActionCommand().equalsIgnoreCase("Siguiente"))
				moverRegistro(MoverRegistro.SIGUIENTE);
			else if (e.getActionCommand().equalsIgnoreCase("Ultimo"))
				moverRegistro(MoverRegistro.ULTIMO);
			else if (e.getActionCommand().equalsIgnoreCase("Atras"))
				moverRegistro(MoverRegistro.ATRAS);
			else if (e.getActionCommand().equalsIgnoreCase("Primero"))
				moverRegistro(MoverRegistro.PRIMERO);
			else if (e.getActionCommand().equalsIgnoreCase("Guardar"))
				guardar();
			else if(e.getActionCommand().equalsIgnoreCase("Modificar"))
				modificar();
			else if(e.getActionCommand().equalsIgnoreCase("Eliminar"))
				eliminar();
			else if (e.getActionCommand().equalsIgnoreCase("Cancelar"))
			{
				actualizarLista();
				iniciarBotones();
			}		
			else if (e.getActionCommand().equalsIgnoreCase("Salir"))
			{
				controladorPrincipal.visualizarVentana();
				ventana.setVisible(false);
				ventana.dispose();
			}
			
		
		}		
		
	}

	@Override
	public void focusGained(FocusEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void focusLost(FocusEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.JTextField)
		{
			
			Categoria categoria= new Categoria(ventana.getCodCategoria(),"","");
			
			try
			{
			  
			  /*Actualiza el ArrayList con la base de datos*/
			  if (!categorias.containsAll(categoriaDao.consultarCategoriaActivos()))
			  {
				  if (!categorias.isEmpty())	
						categorias.clear();
					  
				  categorias.addAll(categoriaDao.consultarCategoriaActivos());
			  } 
			 /********************************************/
			 	
			  if (categorias.contains(categoria))
			  {
				 i= categorias.indexOf(categoria); 
				 actualizarVentana(categorias.get(i));
				 ventana.deshabilitarBotonActualizar("Guardar");
				 ventana.habilitarBotonActualizar("Eliminar");
				 ventana.deshabilitarBotonActualizar("Modificar");
				 ventana.deshabilitarBotonActualizar("Cancelar");
				 
				 ventana.habilitarNavegacion();
				 guardando=false;
				 
			  }
			  else
			  {
				 ventana.limpiarTextos();
				 ventana.habilitarBotonActualizar("Guardar");
				 ventana.habilitarBotonActualizar("Cancelar");
				 ventana.deshabilitarBotonActualizar("Modificar");
				 ventana.deshabilitarBotonActualizar("Eliminar");
				 ventana.deshabilitarNavegacion();
				 guardando= true;
			  }
			  
			  
			}
			catch(Exception e)
			{
				Mensaje.mostrarError(e.getMessage());
			}
			
		}
		
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.text.JTextComponent)
		{
			javax.swing.text.JTextComponent txt= (javax.swing.text.JTextComponent) evt.getSource();
			
			if (txt.getName().equalsIgnoreCase("txtCodCategoria"))
			{				
			   if (ventana.getCodCategoria().length()==Categoria.MAXCODIGO)
					evt.setKeyChar(Character.MIN_VALUE);
				
			}
			else if ((txt.getName().equalsIgnoreCase("txtNombreCorto")))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || ventana.getNombreCorto().length()==Categoria.MAXNOMBRECORTO))
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
					    ventana.habilitarBotonActualizar("Guardar");
					    ventana.deshabilitarBotonActualizar("Modificar");
					    ventana.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
						 ventana.deshabilitarBotonActualizar("Guardar");
						 ventana.habilitarBotonActualizar("Modificar");
						 ventana.deshabilitarBotonActualizar("Eliminar");
					}
					ventana.habilitarBotonActualizar("Cancelar");
				}
			}
			else if (txt.getName().equalsIgnoreCase("txtNombreLargo"))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || ventana.getNombreCorto().length()==Categoria.MAXNOMBRELARGO))
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
					    ventana.habilitarBotonActualizar("Guardar");
					    ventana.deshabilitarBotonActualizar("Modificar");
					    ventana.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
						 ventana.deshabilitarBotonActualizar("Guardar");
						 ventana.habilitarBotonActualizar("Modificar");
						 ventana.deshabilitarBotonActualizar("Eliminar");
					}
					ventana.habilitarBotonActualizar("Cancelar");
				}
			}
			
			
			
			
		}
		
	}
	
	
	public void windowOpened(WindowEvent event)
	{
	   actualizarLista();
	   iniciarBotones();
	}
	
	
	public void windowClosing(WindowEvent event)
	{
		controladorPrincipal.visualizarVentana();
		ventana.setVisible(false);
		ventana.dispose();
	}


    
	

}
